//
//  ZMAppShareData.swift
//  TravelForUser
//
//  Created by 刘亿前 on 2020/9/2.
//  Copyright © 2020 智蚂优服. All rights reserved.
//

import Foundation
import RxSwift
import SwiftUI
import RxRelay
import HandyJSON

class ZMAppShareData {
    
    // 用户信息key
    let USER_INFO_KEY = "USER_INFO_KEY"
    // 用户token信息
    let USER_TOKEN_KEY = "USER_TOKEN_KEY"
    
    static let share = ZMAppShareData()
   
    var safeUserId : Int {
        get {
            return loginInfo?.uid ?? 0
        }
    }
    
    var randomKey : String {
        get {
            return loginInfo?.randomKey ?? ""
        }
    }
    
    /// 当前用户信息观察者
    let userInfo : BehaviorRelay<CommonModels.UserInfo?> = BehaviorRelay(value: nil)
    
    var safeUserInfo : CommonModels.UserInfo {
        get {
            return userInfo.value ?? CommonModels.UserInfo()
        }
    }
    
    /// 用户当前token 信息, 不为nil就是处于登录状态
    var loginInfo : LoginModels.LoginResponse? {
        didSet {
            if let loginInfo = loginInfo, let json = loginInfo.toJSON() {
                UserDefaults.standard.setValue(json, forKey: USER_TOKEN_KEY)
            } else {
                UserDefaults.standard.removeObject(forKey: USER_TOKEN_KEY)
            }
        }
    }

    // 请求用户信息垃圾袋
    var requestUserInfoDisposeBag = DisposeBag()

    let disposeBag = DisposeBag()
    
    
    private init() {
        loadDiskInfo()
    }
    
    // 尝试从本地加载缓存的信息
    func loadDiskInfo() {
        // 加载登录信息
        if let json = UserDefaults.standard.object(forKey: USER_TOKEN_KEY) as? [String : Any], let m = LoginModels.LoginResponse.deserialize(from: json){
            loginInfo = m
        }
        
        // 加载用户信息
        if let json = UserDefaults.standard.object(forKey: USER_INFO_KEY) as? [String : Any], let m = CommonModels.UserInfo.deserialize(from: json){
            userInfo.accept(m)
        }
    }
    
    /// 是否登录
    func isLogin(_ pushLogin: Bool = true, _ block: (( _ login: Bool) -> ())?) {
//        if user == nil && pushLogin {
//            router.push(RouterUrl.loginModule.loginPage)
//        }
//        guard let block = block else { return }
//        block(user != nil)
    }
    
    /// 是否登录
    var isLogin : Bool {
        get {
            return loginInfo != nil
        }
    }
    
    
//    func checkAllOk
    
    /// 保存登录信息
    func saveLoginInfo() {
//        UserDefaults.standard.set(loginInfo!.toJSON(), forKey: "loginInfo")
//        UserDefaults.standard.synchronize()
//        userID = loginInfo!.id
//        requestUserInfo(loginIM : true)
//        requestBankInfo()
    }
    
    /// 获取登录信息
    func getLoginInfo() {
//        if let dic = UserDefaults.standard.object(forKey: "loginInfo") {
//            guard let data = JSONDeserializer<ZMLoginModel>.deserializeFrom(dict: (dic as! [String: Any])) else {return}
//            loginInfo = data
//            userID = data.id
//            requestUserInfo(loginIM : true)
//            requestBankInfo()
//        }
    }
    
    /// 保存用户信息
    func saveUserInfo() {
        guard let user = userInfo.value, let json = user.toJSON() else {return}
        UserDefaults.standard.set(json, forKey: USER_INFO_KEY)
        UserDefaults.standard.synchronize()
    }

    /// 清空用户信息（退出登录）
    func clearUserInfo() {
        loginInfo = nil
        userInfo.accept(nil)
        UserDefaults.standard.removeObject(forKey: USER_INFO_KEY)
        UserDefaults.standard.removeObject(forKey: USER_TOKEN_KEY)
    }

    /// 获取用户信息
    func requestUserInfo(compelte : @escaping ((_ ok : Bool)->())) {
        guard isLogin else {return}
        requestUserInfoDisposeBag = DisposeBag()
        MineAPI.userInfo([:]).rxRequest(type: CommonModels.UserInfo.self).subscribe(onNext:{ [unowned self] resp in
            self.userInfo.accept(resp)
            self.saveUserInfo()
            compelte(true)
        }, onError: { _ in
            compelte(false)
        }).disposed(by: requestUserInfoDisposeBag)
    }
    
    
    // 提供正确的初始化控制器
    func provideStartVC() -> UIViewController {
        if developMode == 4 {
            let nav = HBDNavigationController(rootViewController: TestBatchLogin())
            return nav
        } else {
            return MainVC()
        }

    }
}
